
/*
This file is part of MJIN2.

Copyright (C) 2012-2013 Opensource Game Studio

This software is provided 'as-is', without any express or implied
warranty.  In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:

1. The origin of this software must not be misrepresented; you must not
   claim that you wrote the original software. If you use this software
   in a product, an acknowledgment in the product documentation would be
   appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
   misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/

#include <mjin2/InputListener.h>
#include <mjin2/priv/InputTranslator.h>

namespace mjin2
{
namespace priv
{

InputTranslator::InputTranslator() throw ()
{
    insert(INPUT_SCROLL_NONE,  "INPUT_SCROLL_NONE");
    insert(INPUT_SCROLL_LEFT,  "INPUT_SCROLL_LEFT");
    insert(INPUT_SCROLL_RIGHT, "INPUT_SCROLL_RIGHT");
    insert(INPUT_SCROLL_UP,    "INPUT_SCROLL_UP");
    insert(INPUT_SCROLL_DOWN,  "INPUT_SCROLL_DOWN");
    insert(INPUT_MOUSE_MOVE,        "INPUT_MOUSE_MOVE");
    insert(INPUT_MOUSE_BUTTON_LEFT,     "INPUT_MOUSE_BUTTON_LEFT");
    insert(INPUT_MOUSE_BUTTON_MIDDLE,       "INPUT_MOUSE_BUTTON_MIDDLE");
    insert(INPUT_MOUSE_BUTTON_NONE,     "INPUT_MOUSE_BUTTON_NONE");
    insert(INPUT_MOUSE_BUTTON_RIGHT,        "INPUT_MOUSE_BUTTON_RIGHT");
    insert(INPUT_KEY_SPACE,     "INPUT_KEY_SPACE");
    insert(INPUT_KEY_0,     "INPUT_KEY_0");
    insert(INPUT_KEY_1,     "INPUT_KEY_1");
    insert(INPUT_KEY_2,     "INPUT_KEY_2");
    insert(INPUT_KEY_3,     "INPUT_KEY_3");
    insert(INPUT_KEY_4,     "INPUT_KEY_4");
    insert(INPUT_KEY_5,     "INPUT_KEY_5");
    insert(INPUT_KEY_6,     "INPUT_KEY_6");
    insert(INPUT_KEY_7,     "INPUT_KEY_7");
    insert(INPUT_KEY_8,     "INPUT_KEY_8");
    insert(INPUT_KEY_9,     "INPUT_KEY_9");
    insert(INPUT_KEY_A,     "INPUT_KEY_A");
    insert(INPUT_KEY_B,     "INPUT_KEY_B");
    insert(INPUT_KEY_C,     "INPUT_KEY_C");
    insert(INPUT_KEY_D,     "INPUT_KEY_D");
    insert(INPUT_KEY_E,     "INPUT_KEY_E");
    insert(INPUT_KEY_F,     "INPUT_KEY_F");
    insert(INPUT_KEY_G,     "INPUT_KEY_G");
    insert(INPUT_KEY_H,     "INPUT_KEY_H");
    insert(INPUT_KEY_I,     "INPUT_KEY_I");
    insert(INPUT_KEY_J,     "INPUT_KEY_J");
    insert(INPUT_KEY_K,     "INPUT_KEY_K");
    insert(INPUT_KEY_L,     "INPUT_KEY_L");
    insert(INPUT_KEY_M,     "INPUT_KEY_M");
    insert(INPUT_KEY_N,     "INPUT_KEY_N");
    insert(INPUT_KEY_O,     "INPUT_KEY_O");
    insert(INPUT_KEY_P,     "INPUT_KEY_P");
    insert(INPUT_KEY_Q,     "INPUT_KEY_Q");
    insert(INPUT_KEY_R,     "INPUT_KEY_R");
    insert(INPUT_KEY_S,     "INPUT_KEY_S");
    insert(INPUT_KEY_T,     "INPUT_KEY_T");
    insert(INPUT_KEY_U,     "INPUT_KEY_U");
    insert(INPUT_KEY_V,     "INPUT_KEY_V");
    insert(INPUT_KEY_W,     "INPUT_KEY_W");
    insert(INPUT_KEY_X,     "INPUT_KEY_X");
    insert(INPUT_KEY_Y,     "INPUT_KEY_Y");
    insert(INPUT_KEY_Z,     "INPUT_KEY_Z");
    insert(INPUT_KEY_EXCLAIM,       "INPUT_KEY_EXCLAIM");
    insert(INPUT_KEY_QUOTEDBL,      "INPUT_KEY_QUOTEDBL");
    insert(INPUT_KEY_HASH,      "INPUT_KEY_HASH");
    insert(INPUT_KEY_DOLLAR,        "INPUT_KEY_DOLLAR");
    insert(INPUT_KEY_AMPERSAND,     "INPUT_KEY_AMPERSAND");
    insert(INPUT_KEY_QUOTE,     "INPUT_KEY_QUOTE");
    insert(INPUT_KEY_LEFTPAREN,     "INPUT_KEY_LEFTPAREN");
    insert(INPUT_KEY_RIGHTPAREN,        "INPUT_KEY_RIGHTPAREN");
    insert(INPUT_KEY_ASTERISK,      "INPUT_KEY_ASTERISK");
    insert(INPUT_KEY_PLUS,      "INPUT_KEY_PLUS");
    insert(INPUT_KEY_COMMA,     "INPUT_KEY_COMMA");
    insert(INPUT_KEY_MINUS,     "INPUT_KEY_MINUS");
    insert(INPUT_KEY_PERIOD,        "INPUT_KEY_PERIOD");
    insert(INPUT_KEY_SLASH,     "INPUT_KEY_SLASH");
    insert(INPUT_KEY_COLON,     "INPUT_KEY_COLON");
    insert(INPUT_KEY_SEMICOLON,     "INPUT_KEY_SEMICOLON");
    insert(INPUT_KEY_LESS,      "INPUT_KEY_LESS");
    insert(INPUT_KEY_EQUALS,        "INPUT_KEY_EQUALS");
    insert(INPUT_KEY_GREATER,       "INPUT_KEY_GREATER");
    insert(INPUT_KEY_QUESTION,      "INPUT_KEY_QUESTION");
    insert(INPUT_KEY_AT,        "INPUT_KEY_AT");
    insert(INPUT_KEY_LEFTBRACKET,       "INPUT_KEY_LEFTBRACKET");
    insert(INPUT_KEY_BACKSLASH,     "INPUT_KEY_BACKSLASH");
    insert(INPUT_KEY_RIGHTBRACKET,      "INPUT_KEY_RIGHTBRACKET");
    insert(INPUT_KEY_CARET,     "INPUT_KEY_CARET");
    insert(INPUT_KEY_UNDERSCORE,        "INPUT_KEY_UNDERSCORE");
    insert(INPUT_KEY_BACKQUOTE,     "INPUT_KEY_BACKQUOTE");
    insert(INPUT_KEY_BACKSPACE,     "INPUT_KEY_BACKSPACE");
    insert(INPUT_KEY_TAB,       "INPUT_KEY_TAB");
    insert(INPUT_KEY_LINEFEED,      "INPUT_KEY_LINEFEED");
    insert(INPUT_KEY_CLEAR,     "INPUT_KEY_CLEAR");
    insert(INPUT_KEY_RETURN,        "INPUT_KEY_RETURN");
    insert(INPUT_KEY_PAUSE,     "INPUT_KEY_PAUSE");
    insert(INPUT_KEY_SCROLL_LOCK,       "INPUT_KEY_SCROLL_LOCK");
    insert(INPUT_KEY_SYS_REQ,       "INPUT_KEY_SYS_REQ");
    insert(INPUT_KEY_ESCAPE,        "INPUT_KEY_ESCAPE");
    insert(INPUT_KEY_DELETE,        "INPUT_KEY_DELETE");
    insert(INPUT_KEY_HOME,      "INPUT_KEY_HOME");
    insert(INPUT_KEY_LEFT,      "INPUT_KEY_LEFT");
    insert(INPUT_KEY_UP,        "INPUT_KEY_UP");
    insert(INPUT_KEY_RIGHT,     "INPUT_KEY_RIGHT");
    insert(INPUT_KEY_DOWN,      "INPUT_KEY_DOWN");
    insert(INPUT_KEY_PRIOR,     "INPUT_KEY_PRIOR");
    insert(INPUT_KEY_PAGE_UP,       "INPUT_KEY_PAGE_UP");
    insert(INPUT_KEY_NEXT,      "INPUT_KEY_NEXT");
    insert(INPUT_KEY_PAGE_DOWN,     "INPUT_KEY_PAGE_DOWN");
    insert(INPUT_KEY_END,       "INPUT_KEY_END");
    insert(INPUT_KEY_BEGIN,     "INPUT_KEY_BEGIN");
    insert(INPUT_KEY_SELECT,        "INPUT_KEY_SELECT");
    insert(INPUT_KEY_PRINT,     "INPUT_KEY_PRINT");
    insert(INPUT_KEY_INSERT,        "INPUT_KEY_INSERT");
    insert(INPUT_KEY_UNDO,      "INPUT_KEY_UNDO");
    insert(INPUT_KEY_REDO,      "INPUT_KEY_REDO");
    insert(INPUT_KEY_MENU,      "INPUT_KEY_MENU");
    insert(INPUT_KEY_FIND,      "INPUT_KEY_FIND");
    insert(INPUT_KEY_CANCEL,        "INPUT_KEY_CANCEL");
    insert(INPUT_KEY_HELP,      "INPUT_KEY_HELP");
    insert(INPUT_KEY_BREAK,     "INPUT_KEY_BREAK");
    insert(INPUT_KEY_MODE_SWITCH,       "INPUT_KEY_MODE_SWITCH");
    insert(INPUT_KEY_SCRIPT_SWITCH,     "INPUT_KEY_SCRIPT_SWITCH");
    insert(INPUT_KEY_NUM_LOCK,      "INPUT_KEY_NUM_LOCK");
    insert(INPUT_KEY_KP_SPACE,      "INPUT_KEY_KP_SPACE");
    insert(INPUT_KEY_KP_TAB,        "INPUT_KEY_KP_TAB");
    insert(INPUT_KEY_KP_ENTER,      "INPUT_KEY_KP_ENTER");
    insert(INPUT_KEY_KP_F1,     "INPUT_KEY_KP_F1");
    insert(INPUT_KEY_KP_F2,     "INPUT_KEY_KP_F2");
    insert(INPUT_KEY_KP_F3,     "INPUT_KEY_KP_F3");
    insert(INPUT_KEY_KP_F4,     "INPUT_KEY_KP_F4");
    insert(INPUT_KEY_KP_HOME,       "INPUT_KEY_KP_HOME");
    insert(INPUT_KEY_KP_LEFT,       "INPUT_KEY_KP_LEFT");
    insert(INPUT_KEY_KP_UP,     "INPUT_KEY_KP_UP");
    insert(INPUT_KEY_KP_RIGHT,      "INPUT_KEY_KP_RIGHT");
    insert(INPUT_KEY_KP_DOWN,       "INPUT_KEY_KP_DOWN");
    insert(INPUT_KEY_KP_PRIOR,      "INPUT_KEY_KP_PRIOR");
    insert(INPUT_KEY_KP_PAGE_UP,        "INPUT_KEY_KP_PAGE_UP");
    insert(INPUT_KEY_KP_NEXT,       "INPUT_KEY_KP_NEXT");
    insert(INPUT_KEY_KP_PAGE_DOWN,      "INPUT_KEY_KP_PAGE_DOWN");
    insert(INPUT_KEY_KP_END,        "INPUT_KEY_KP_END");
    insert(INPUT_KEY_KP_BEGIN,      "INPUT_KEY_KP_BEGIN");
    insert(INPUT_KEY_KP_INSERT,     "INPUT_KEY_KP_INSERT");
    insert(INPUT_KEY_KP_DELETE,     "INPUT_KEY_KP_DELETE");
    insert(INPUT_KEY_KP_EQUAL,      "INPUT_KEY_KP_EQUAL");
    insert(INPUT_KEY_KP_MULTIPLY,       "INPUT_KEY_KP_MULTIPLY");
    insert(INPUT_KEY_KP_ADD,        "INPUT_KEY_KP_ADD");
    insert(INPUT_KEY_KP_SEPARATOR,      "INPUT_KEY_KP_SEPARATOR");
    insert(INPUT_KEY_KP_SUBTRACT,       "INPUT_KEY_KP_SUBTRACT");
    insert(INPUT_KEY_KP_DECIMAL,        "INPUT_KEY_KP_DECIMAL");
    insert(INPUT_KEY_KP_DIVIDE,     "INPUT_KEY_KP_DIVIDE");
    insert(INPUT_KEY_KP_0,      "INPUT_KEY_KP_0");
    insert(INPUT_KEY_KP_1,      "INPUT_KEY_KP_1");
    insert(INPUT_KEY_KP_2,      "INPUT_KEY_KP_2");
    insert(INPUT_KEY_KP_3,      "INPUT_KEY_KP_3");
    insert(INPUT_KEY_KP_4,      "INPUT_KEY_KP_4");
    insert(INPUT_KEY_KP_5,      "INPUT_KEY_KP_5");
    insert(INPUT_KEY_KP_6,      "INPUT_KEY_KP_6");
    insert(INPUT_KEY_KP_7,      "INPUT_KEY_KP_7");
    insert(INPUT_KEY_KP_8,      "INPUT_KEY_KP_8");
    insert(INPUT_KEY_KP_9,      "INPUT_KEY_KP_9");
    insert(INPUT_KEY_F1,        "INPUT_KEY_F1");
    insert(INPUT_KEY_F2,        "INPUT_KEY_F2");
    insert(INPUT_KEY_F3,        "INPUT_KEY_F3");
    insert(INPUT_KEY_F4,        "INPUT_KEY_F4");
    insert(INPUT_KEY_F5,        "INPUT_KEY_F5");
    insert(INPUT_KEY_F6,        "INPUT_KEY_F6");
    insert(INPUT_KEY_F7,        "INPUT_KEY_F7");
    insert(INPUT_KEY_F8,        "INPUT_KEY_F8");
    insert(INPUT_KEY_F9,        "INPUT_KEY_F9");
    insert(INPUT_KEY_F10,       "INPUT_KEY_F10");
    insert(INPUT_KEY_F11,       "INPUT_KEY_F11");
    insert(INPUT_KEY_F12,       "INPUT_KEY_F12");
    insert(INPUT_KEY_F13,       "INPUT_KEY_F13");
    insert(INPUT_KEY_F14,       "INPUT_KEY_F14");
    insert(INPUT_KEY_F15,       "INPUT_KEY_F15");
    insert(INPUT_KEY_F16,       "INPUT_KEY_F16");
    insert(INPUT_KEY_F17,       "INPUT_KEY_F17");
    insert(INPUT_KEY_F18,       "INPUT_KEY_F18");
    insert(INPUT_KEY_F19,       "INPUT_KEY_F19");
    insert(INPUT_KEY_F20,       "INPUT_KEY_F20");
    insert(INPUT_KEY_F21,       "INPUT_KEY_F21");
    insert(INPUT_KEY_F22,       "INPUT_KEY_F22");
    insert(INPUT_KEY_F23,       "INPUT_KEY_F23");
    insert(INPUT_KEY_F24,       "INPUT_KEY_F24");
    insert(INPUT_KEY_F25,       "INPUT_KEY_F25");
    insert(INPUT_KEY_F26,       "INPUT_KEY_F26");
    insert(INPUT_KEY_F27,       "INPUT_KEY_F27");
    insert(INPUT_KEY_F28,       "INPUT_KEY_F28");
    insert(INPUT_KEY_F29,       "INPUT_KEY_F29");
    insert(INPUT_KEY_F30,       "INPUT_KEY_F30");
    insert(INPUT_KEY_F31,       "INPUT_KEY_F31");
    insert(INPUT_KEY_F32,       "INPUT_KEY_F32");
    insert(INPUT_KEY_F33,       "INPUT_KEY_F33");
    insert(INPUT_KEY_F34,       "INPUT_KEY_F34");
    insert(INPUT_KEY_F35,       "INPUT_KEY_F35");
    insert(INPUT_KEY_SHIFT_L,       "INPUT_KEY_SHIFT_L");
    insert(INPUT_KEY_SHIFT_R,       "INPUT_KEY_SHIFT_R");
    insert(INPUT_KEY_CONTROL_L,     "INPUT_KEY_CONTROL_L");
    insert(INPUT_KEY_CONTROL_R,     "INPUT_KEY_CONTROL_R");
    insert(INPUT_KEY_CAPS_LOCK,     "INPUT_KEY_CAPS_LOCK");
    insert(INPUT_KEY_SHIFT_LOCK,        "INPUT_KEY_SHIFT_LOCK");
    insert(INPUT_KEY_META_L,        "INPUT_KEY_META_L");
    insert(INPUT_KEY_META_R,        "INPUT_KEY_META_R");
    insert(INPUT_KEY_ALT_L,     "INPUT_KEY_ALT_L");
    insert(INPUT_KEY_ALT_R,     "INPUT_KEY_ALT_R");
    insert(INPUT_KEY_SUPER_L,       "INPUT_KEY_SUPER_L");
    insert(INPUT_KEY_SUPER_R,       "INPUT_KEY_SUPER_R");
    insert(INPUT_KEY_HYPER_L,       "INPUT_KEY_HYPER_L");
    insert(INPUT_KEY_HYPER_R,       "INPUT_KEY_HYPER_R");
}
    
s32 InputTranslator::id(const String &sid) throw (Exception)
{
    auto it = mIDs.find(sid);
    if (it == mIDs.end())
        MJIN2_EXCEPTION("Invalid input string",
                        MJIN2_STR("String '%s' does not exist in InputTranslator",
                                  sid.c_str()));
    return it->second;
}

String InputTranslator::string(s32 id) throw (Exception)
{
    auto it = mStrings.find(id);
    if (it == mStrings.end())
        MJIN2_EXCEPTION("Invalid input ID",
                        MJIN2_STR("ID '%d' does not exist in InputTranslator",
                                  id));
    return it->second;
}

void InputTranslator::insert(s32 id, const String &sid)
{
    mIDs.insert(std::pair<String, s32>(sid, id));
    mStrings.insert(std::pair<s32, String>(id, sid));
}

} // namespace priv
} // namespace mjin2

